package core

import (
	"fmt"
	"time"

	"ipparse/internal/utils"
)

// FormatIPPackage 格式化IP数据包输出
func FormatIPPackage(pkg *IPPackage, packetNum int, addr string) string {
	timestamp := time.Now().Format("2006-01-02 15:04:05")

	reserved, dontFragment, moreFragments := utils.ParseFlags(pkg.Header.Flags)

	output := fmt.Sprintf(`
==================== IP数据包解析 #%d [%s] ====================
来源地址:       %s
版本:           %d
头长度:         %d (实际字节数: %d)
服务类型:       %d (0x%02X)
总长度:         %d 字节
标识:           %d (0x%04X)
标志位:
  保留位:       %t
  不分片:       %t
  更多片段:     %t
片段偏移:       %d
生存时间(TTL):  %d
协议:           %s
头校验和:       0x%04X
源IP地址:       %s
目标IP地址:     %s
选项长度:       %d 字节
数据长度:       %d 字节
===============================================================
`,
		packetNum,
		timestamp,
		addr,
		pkg.Header.Version,
		pkg.Header.HeaderLength,
		pkg.Header.HeaderLength*4,
		pkg.Header.DifferentiatedServices,
		pkg.Header.DifferentiatedServices,
		pkg.Header.TotalLength,
		pkg.Header.Identification,
		pkg.Header.Identification,
		reserved,
		dontFragment,
		moreFragments,
		pkg.Header.FragmentOffset,
		pkg.Header.TimeToLive,
		utils.GetProtocolName(pkg.Header.Protocol),
		pkg.Header.Checksum,
		utils.FormatIPAddress(pkg.Header.SourceAddress),
		utils.FormatIPAddress(pkg.Header.DestinationAddress),
		len(pkg.Header.Options),
		pkg.GetPayloadLength())

	return output
}
